﻿using System;
using System.Collections.Generic;
using System.Text;

using System.DirectoryServices;
using AccountHelper.Properties;

namespace AccountHelper
{
    public class AccountSetter
    {

        public static void ChangePassword(string ad_domain, string ad_account, string ad_password, string user_account, string user_password, string user_password_new)
        {
            try
            {
                if (string.IsNullOrEmpty(ad_domain)) throw new Exception("AD서버 도메인 정보를 확인해주세요.");
                else if (string.IsNullOrEmpty(ad_account)) throw new Exception("AD서버 관리자 계정 정보를 확인해주세요.");
                else if (string.IsNullOrEmpty(ad_password)) throw new Exception("AD서버 관리자 비밀번호 정보를 확인해주세요.");
                else if (string.IsNullOrEmpty(user_account)) throw new Exception("계정 이름이 공백입니다.");
                else if (string.IsNullOrEmpty(user_password)) throw new Exception("계정 비밀번호가 공백입니다.");
                else if (string.IsNullOrEmpty(user_password_new)) throw new Exception("신규 비밀번호가 공백입니다.");

                using (DirectoryEntry entryServer = new DirectoryEntry("LDAP://" + ad_domain, ad_account, ad_password))
                {
                    // entry 내 특성값 체크만 해도 예외 발생됨.｝
                    try
                    {
                        string.IsNullOrEmpty(entryServer.Guid.ToString("N"));
                    }
                    catch (Exception ex)
                    {
                        throw new Exception("AD서버 로그인 정보를 다시 확인해주세요. -관리자 영역-", ex);
                    }

                    DirectorySearcher search = new DirectorySearcher(entryServer);
                    search.Filter = "(SAMAccountName=" + user_account + ")";
                    search.PropertiesToLoad.Add("cn");
                    SearchResult result = search.FindOne();

                    if (result == null) throw new Exception("계정 정보를 다시확인해주세요. -계정명 오류-");

                    using (DirectoryEntry entryUserCheck = new DirectoryEntry("LDAP://" + ad_domain, user_account, user_password))
                    {
                        // entry 내 특성값 체크만 해도 예외 발생됨.
                        try
                        {
                            string.IsNullOrEmpty(entryUserCheck.Guid.ToString("N"));
                        }
                        catch (Exception ex)
                        {
                            throw new Exception("계정 정보를 다시 확인해주세요. -비밀번호 오류-", ex);
                        }
                    }

                    using (DirectoryEntry entryUser = result.GetDirectoryEntry())
                    {
                        entryUser.Invoke("SetPassword", new object[] { user_password_new });
                        entryUser.CommitChanges();
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
            }
        }
    }
}